package reso;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;

import porte.Client;
import reso.ImplementServeurDeVoiture;

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;


public class ImplementServeurDeVoiture extends UnicastRemoteObject implements ServeurDeVoiture {

	private static final long serialVersionUID = -1836358785002421897L;
	
	private List<Client> portes;
	
	private Random random;
	
	// Nombre de porte dans le parking
	private int nombrePorte;
	
	private int nombreDeVoitureInParking;
	
	private int nombreDeDemand;
	
	private int nombreDePlaceLibre;

	public ImplementServeurDeVoiture(int nombrePorte, int nombrePlaceParking) throws RemoteException {
		super();
		nombreDeDemand = 30;
		this.nombrePorte = nombrePorte;
		this.nombreDePlaceLibre = Client.nombreDePlaceLibre;
		this.portes = new ArrayList<Client>();
		this.random = new Random(System.currentTimeMillis());

	}

	@Override
	public synchronized void addNewPorte(Client porte) throws RemoteException {
		portes.add(porte);
		System.out.println("Une nouvelle porte a été ajouté");
		if (this.portes.size() == this.nombrePorte) {
			this.notifyAll();			
		}
	}
	
	public void simulEntreeSortie() throws RemoteException {
		
		for (int i = 0; i < this.getNombreDeDemand(); i++) {
			
			int randomPorte = (int) (Math.random() * this.nombrePorte);
			int randomCas = (int) (Math.random() * 10);
			
			System.out.println("nombre de place libre : "+this.nombreDePlaceLibre);
			
			if (randomCas < 3) {
				System.out.println("SERVEUR: porte "+randomPorte+" demande: ENTREE");
				this.getPorte(randomPorte).demandeEntree();
				this.nombreDePlaceLibre--;
			} 
			else if (nombreDePlaceLibre < Client.nombreDePlaceLibre){
				System.out.println("SERVEUR: porte "+randomPorte+" demande: SORTIE");
				this.getPorte(randomPorte).demandeSortie();
				this.nombreDePlaceLibre++;
			}
			else {
				System.out.println("SERVEUR: impossible de demander une SORTIE\n plus voiture dans le parking");
			}
			
		}
	}
	
	public int getNombreDeDemand() {
		return nombreDeDemand;
	}
	
	@Override
	public Client getPorte(int index) throws RemoteException {
		return this.portes.get(index);
	}	
	
	public static void main(String [] args) throws RemoteException {
		
		ImplementServeurDeVoiture serveurDeVoiture = null;
		
		Registry registry = LocateRegistry.getRegistry();
		serveurDeVoiture = new ImplementServeurDeVoiture(Client.nombreDePortes, Client.nombreDePlaceLibre);

		
		registry.rebind(ServeurDeVoiture.NAME, serveurDeVoiture);
		
		System.out.println("ServeurDeVoiture successfully launched!");
		
		synchronized (serveurDeVoiture) {
			
			try {
				serveurDeVoiture.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		
		System.out.println("Start to simulEntreSortie");
		
		serveurDeVoiture.simulEntreeSortie();
		

		
	}
}